
#include <iostream>

template<class R, class T, class... Args>
auto turn(R(T::*f)(Args...))
{
	return [f](T* t, Args... args) {
		return (t->*f)(args...);
	};
}

class A
{
public:
	int id;
	A(int x) :id(x) {}
	void get() {
		std::cout << "get : " << id << std::endl;
	}
    bool set(int num)
    {
        id = num;
		std::cout << "set : " << id << std::endl;
        return true;
    }
	virtual int do_nothing()
	{
		std::cout << "do nothing" << std::endl;
		return 0;
	}
	static int do_nothing2()
	{
		std::cout << "do nothing2" << std::endl;
		return 0;
	}
};


int main()
{
	A a(233);
	auto g = turn(&A::get);
	auto s = turn(&A::set);
	auto d = turn(&A::do_nothing);

	/* 	error!!!!!
		A::do_nothing2 signature is int (*)(void);
		but need int(A::*)(void)!!!!!! 
	*/
	// auto d2 = turn(&A::do_nothing2);

	g(&a);
    s(&a, 100);
	g(&a);
	d(&a);
	return 0;
}
